/**
 * 淘宝直播大屏数据port处理接口
 */
import moment from "moment/moment"

import type { PlasmoMessaging } from "@plasmohq/messaging"

// 淘宝请求数据格式定义
interface tbScriptResponseData {
  // 请求数据列表
  dataList: {
    // 数据列表
    data: any[]
    // 数据类型
    type: string
  }[]
}

// 实例数据
let tbLiveScreenData = {}

// 更新数据
const updateLiveScreenData = (data: object) => {
  tbLiveScreenData = {
    ...tbLiveScreenData,
    ...data
  }
}

// 淘宝api回复数据项格式化处理
const formatTbResponseDataItem = (resItem: {
  format: string
  split: string
  value: string
}) => {
  // 生成对象
  const result = {}
  // 将format和value字符串分别解析成数组
  const formatArray = resItem.format.split(resItem.split)
  const valueArray = resItem.value.split(resItem.split)
  for (let i = 0; i < formatArray.length; i++) {
    result[formatArray[i]] = decodeURIComponent(valueArray[i])
  }
  return result
}

// 请求结果处理器
// 基础信息处理
const statInfoDataHandler = (responseData: tbScriptResponseData) => {
  // console.log(resData)
  const _data = {
    // 主播间名称
    live_room: responseData["userNick"] || "",
    // 开播时间
    live_start_time: moment(Number(responseData["startTime"])).format(
      "YYYY-MM-DD HH:mm:ss"
    ),
    // 是否直播结束
    live_end: Number(responseData["roomStatus"]) === 2
  }
  // 如果直播结束，则添加结束时间
  if (_data.live_end) {
    _data["live_end_time"] = moment(Number(responseData["endTime"])).format(
      "YYYY-MM-DD HH:mm:ss"
    )
  }
  // 更新数据
  updateLiveScreenData(_data)
}
// 直播数据处理
const ecDataHandler = (responseData: any) => {
  try {
    // 拦截数据拆解
    const _resData = {}
    if (
      Object.hasOwn(responseData, "dataList") &&
      Array.isArray(responseData.dataList)
    ) {
      responseData.dataList.forEach((item) => {
        if (item.type === "totalStats") {
          item.data.forEach((_i) => {
            const _f = formatTbResponseDataItem(_i)
            _resData[_f["valueType"]] = {
              title: _f["title"],
              value: Number(_f["valueNum"])
            }
          })
        }
      })
    }
    // 如果符合要求且有拆解数据产生,构建数据对象
    if (Object.keys(_resData).length > 0) {
      let _data = {
        // 直播成交金额
        live_sale_amount: _resData["pay_amt"].value || 0,
        // 观看次数
        live_pv: _resData["pv"].value || 0,
        // 观看人数
        live_uv: _resData["uv"].value || 0,
        // 人均观看时长
        live_viewtime: Math.round(_resData["stay_time_pu"].value || 0),
        // 新增粉丝
        live_addfensi: _resData["atn_uv"].value || 0,
        // 成交人数
        live_sale_count: _resData["pay_buyer_cnt"].value || 0,
        // 成交件数
        deal_count: _resData["pay_item_qty"].value || 0,
        // 成交老粉数
        live_sale_old_fans: Math.round(
          _resData["pay_buyer_cnt"].value *
            (1 - _resData["pay_buyer_cnt_not_fans_rate"].value)
        ),
        // 额外数据
        extra_data: {
          // 非粉丝成交金额占比
          pay_amt_not_fans_rate: _resData["pay_amt_not_fans_rate"].value || 0,
          // 非粉丝成交人数占比
          pay_buyer_cnt_not_fans_rate:
            _resData["pay_buyer_cnt_not_fans_rate"].value || 0
        }
      }
      // 更新数据
      updateLiveScreenData(_data)
    }
  } catch (e) {
    console.log(e)
  }
}

const handler: PlasmoMessaging.PortHandler = async (req, res) => {
  // const { url, response, action } = req.body
  const { api, data, action } = req.body
  if (action === "init") {
    tbLiveScreenData = {}
  } else {
    switch (api) {
      // 直播数据处理
      case "mtop.taobao.iliad.live.user.assistant.data.get":
        ecDataHandler(data)
        break
      // 直播间基础信息处理
      case "mtop.taobao.dreamweb.live.simple.detail.include.del":
        statInfoDataHandler(data)
        break
      default:
        break
    }
  }
  res.send(tbLiveScreenData)
}

export default handler
